<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of ManagerFiltro
 *
 * @author jhonny
 */
class ManagerFiltro extends ManagerParam{
    protected $filtros;
    protected $eliminarfiltro;
    protected $filtroUbicacion;
    protected $inputHiddenFiltro;
    
    public function __construct($sfActions) {
        $this->sfActions = $sfActions;
        $this->filtros = array();
        $this->eliminarfiltro = new EliminarFiltro();
        $this->filtroUbicacion = array();
        //$this->filtroInputHiddenUbicacion = array();
        
    }
    
    public function generar(sfWebRequest $request){
        $paramsArray = null;
//        $this->filtrosHTML = "";
        $strParams = null;
        
        $paramsArray = $this->generateArrayParameters($request);
        $strParams = $this->generateStrParameters($paramsArray);
        
        $this->generarFiltros($paramsArray,$strParams);
        $this->logMessage("filtros : $this->filtros",'info');
        return $this->filtros;
    }
    
    
    /**
     *
     * @param type $params
     * @param type $strParams 
     */
    protected function generarFiltros($params,$strParams){
        
        $this->logMessage("params : $strParams",'info');
        $this->generarFiltroUbicacion($params,$strParams);
        $this->generarFiltroTipo($params,$strParams);
        $this->generarFiltroSexo($params,$strParams);
        $this->generarFiltroIdeologia($params,$strParams);
        $this->generarFiltroNivel($params,$strParams);
        $this->generarFiltroIdioma($params,$strParams);
        
        $countEliminarFiltros = count($this->eliminarfiltro->getEliminarFiltroItem());
        $countEliminarFiltrosUbicacion = count($this->filtroUbicacion);
        if($countEliminarFiltros>0 || $countEliminarFiltrosUbicacion>0){
            $this->eliminarfiltro->setStyleFiltro("display: block");
        }

    }
    private function generarFiltroIdeologia($params,$strParams){
        $this->generarFiltroItem($params, $strParams, "Ideologia", UrlParameter::ideologia, "Listado", "Ideologia", "Ideologia", 3, "");
    }
    private function generarFiltroSexo($params,$strParams){
        $this->generarFiltroItem($params, $strParams, "Sexo", UrlParameter::sexo, "Listado", "Sexo", "Sexo", 3, "");
    }
    private function generarFiltroTipo($params,$strParams){
        $this->generarFiltroItem($params, $strParams, "Tipo", UrlParameter::tipo, "Listado", "Tipo", "Tipo", 3, "");
    }
    private function generarFiltroNivel($params,$strParams){
        $this->generarFiltroItem($params, $strParams, "Nivel", UrlParameter::nivel, "Listado", "Nivél", "Nivél", 3, "");
    }
    private function generarFiltroIdioma($params,$strParams){
        $this->generarFiltroItem($params, $strParams, "Idioma", UrlParameter::idioma, "Listado", "Idioma", "Idioma", 3, "");
    }
    protected function generarFiltroItem($params,$strParams,$dataBase,$urlParam,$class,$name,$label,$countEnabled,$separadorStyle){
        if(!$this->containsParameter($params,  $urlParam)){
            $this->generarFiltroItemNotExist($params, $strParams, $dataBase, $urlParam, $class, $name, $label, $countEnabled, $separadorStyle, 0);
        }else{
            $this->generarFiltroEliminar($this->eliminarfiltro->getEliminarFiltroItem(),$params, $strParams, $dataBase, $urlParam);
        }
    }
    private function generarFiltroEliminar(&$eliminarListafiltros,$params,$strParams,$dataBase,$urlParam){
        $strParams=$this->removeUrlParameter($params,$urlParam);
        $id =$this->getValueFromUrlParam($params,  $urlParam);
        $lista = Doctrine_Core::getTable($dataBase)->getElements($id);
        $this->logMessage("lista de item filtro para eliminar $lista",'info');
        $this->generarEliminarFiltro($eliminarListafiltros,$strParams,$lista);        
    }
    private function generarFiltroItemNotExist($params,$strParams,$dataBase,$urlParam,$class,$name,$label,$countEnabled,$separadorStyle,$prefixId,$listadoCountStyle="",$funcionJavaScript="void(0)"){
        $lista= Doctrine_Core::getTable($dataBase)->getElements();
        $strParams=$this->addUrlParameter($params,$strParams,$urlParam);
        $this->logMessage("lista de item filtro $lista",'info');
        $this->generarFiltrosObject($prefixId,$class, $name, $label, $lista,$countEnabled,$strParams,$params,$urlParam,$separadorStyle,$listadoCountStyle,$funcionJavaScript);
    }
    
    private function generarFiltroItemNotExistUbicacion($params,$strParams,$dataBase,$urlParam,$class,$name,$label,$countEnabled,$separadorStyle,$prefixId,$dataBaseParent,$urlParamParent,$listadoCountStyle="",$funcionJavaScript="void(0)"){
        $this->generarFiltroEliminar($this->filtroUbicacion,$params, $strParams,$dataBaseParent, $urlParamParent);
        $this->generarFiltroItemNotExist($params, $strParams, $dataBase, $urlParam, $class, $name, $label, $countEnabled, $separadorStyle, $prefixId,$listadoCountStyle,$funcionJavaScript);
                
    }

    /**
     *
     * @param type $params
     * @param type $strParams 
     */
    private function generarFiltroUbicacion($params,$strParams){
        
        if(!$this->containsParameter($params,  UrlParameter::idPais)){
            $this->generarFiltroItemNotExist($params, $strParams, 'Pais', UrlParameter::idPais,
              "Listado ListadoUbicacion", "País", "Ubicación", 3, "", 100000000,"","VerMasFunction1()");
//            $listaPaises = Doctrine_Core::getTable('Pais')->getPaises();            
//            $strParams=$this->addUrlParameter($params,$strParams,UrlParameter::idPais);
//            $this->logMessage("lista de paises $listaPaises params $params string params $strParams",'info');
//            $this->generarFiltrosObject(100000000,"Listado ListadoUbicacion", "País", "Ubicación", $listaPaises,3,$strParams,$params,UrlParameter::idPais,"","","VerMasFunction1()");
        }else if(!$this->containsParameter($params,  UrlParameter::idRegion)){
            //tiene el id del pais    
             $this->generarFiltroItemNotExistUbicacion($params, $strParams, 'Provincia', UrlParameter::idRegion,
              "Listado ListadoUbicacion", "Región Búsqueda", "Ubicación", 3, "", 500000000,'Pais',UrlParameter::idPais,"","VerMasFunction1()");
//            $this->generarFiltroEliminar($this->filtroUbicacion,$params, $strParams,"Pais", UrlParameter::idPais);
//
//            $lista= Doctrine_Core::getTable('Provincia')->getProvincias(null);            
//            $strParams=$this->addUrlParameter($params,$strParams,UrlParameter::idRegion);
//            $this->logMessage("lista de paises $lista params $params string params $strParams",'info');
//            $this->generarFiltrosObject(500000000,"Listado ListadoUbicacion", "Región Búsqueda", "Ubicación", $lista,3,$strParams,$params,UrlParameter::idRegion,"","","VerMasFunction1()");
        }else if(!$this->containsParameter($params,  UrlParameter::idPartido)){
            //tiene el id del pais && region
             $this->generarFiltroItemNotExistUbicacion($params, $strParams, 'Partido', UrlParameter::idPartido,
              "Listado ListadoUbicacion", "Partido", "Ubicación", 3, "", 600000000,'Provincia',UrlParameter::idRegion,"","VerMasFunction1()");
            
//            $this->generarFiltroEliminar($this->filtroUbicacion,$params, $strParams,"Provincia", UrlParameter::idRegion);
//            
//            $lista= Doctrine_Core::getTable('Partido')->getPartidos(null);            
//            $strParams=$this->addUrlParameter($params,$strParams,UrlParameter::idPartido);            
//            $this->logMessage("lista de paises $lista params $params string params $strParams",'info');
//            
//            $this->generarFiltrosObject(600000000,"Listado ListadoUbicacion", "Partido", "Ubicación", $lista,3,$strParams,$params,UrlParameter::idPartido,"","","VerMasFunction1()");
        }else if(!$this->containsParameter($params,  UrlParameter::idLocalidad)){
            //tiene el id del pais && region
            $this->generarFiltroItemNotExistUbicacion($params, $strParams, 'Localidad', UrlParameter::idLocalidad,
              "Listado ListadoUbicacion", "Localidad", "Ubicación", 3, "", 700000000,'Partido',UrlParameter::idPartido,"","VerMasFunction1()");
            
//            $this->generarFiltroEliminar($this->filtroUbicacion,$params, $strParams,"Partido", UrlParameter::idPartido);
//            $lista= Doctrine_Core::getTable('Localidad')->getLocalidades(null);            
//            $strParams=$this->addUrlParameter($params,$strParams,UrlParameter::idLocalidad);            
//            $this->logMessage("lista de paises $lista params $params string params $strParams",'info');
//            
//            $this->generarFiltrosObject(700000000,"Listado ListadoUbicacion", "Localidad", "Ubicación", $lista,3,$strParams,$params,UrlParameter::idLocalidad,"","","VerMasFunction1()");
        }else {
            //if(!$this->containsParameter($params,  UrlParameter::idLocalidad))
            //para capital federal es 800000000;
        }        
        $this->generarInputHiddenUbicacion($params);
    }
    /**
     * <input type="hidden" id="sp.Partido" name="sp.Partido" value="39">
            <input type="hidden" id="sp.af_600000039" name="sp.af_600000039" value="600000039">
     * 
     * <input type="hidden" id="selectedLowestRegion" name="Escobar" value="600000039">
            
     * @param type $params vector string
     */
    private function generarInputHiddenUbicacion($params){
        $idExtendido = 0;
        $id = 0;
        $tabla = "";
        $inputHiddenUbicacion = null;
        $this->inputHiddenFiltro = new InputHiddenFiltro();
        foreach ($params as $key=>$value){
            $idExtendido = 0;
            $id = $value;
            
            if($key==UrlParameter::idPais){
                $idExtendido=100000000+$value;
                $tabla = "Pais";
            }else if($key==UrlParameter::idRegion){
                $idExtendido=300000000+$value;                
                $tabla = "Provincia";
            }else if($key==UrlParameter::idPartido){
                $idExtendido=600000000+$value;
                $tabla = "Partido";
            }else if($key==UrlParameter::idLocalidad){
                $idExtendido=00000000+$value;            
                $tabla = "Localidad";
            }else if($key==UrlParameter::idBarrio){
                $idExtendido=00000000+$value;
                $tabla = "Barrio";
//            }else if($key==UrlParameter::idBarrio){
//                $idExtendido=00000000+$value;
            }
            $this->logMessage("input hidden ubicacion $key => $value  id extendido $idExtendido", "info");
            if($idExtendido>0){
                $inputHiddenUbicacion = new InputHiddenUbicacion();      
                $inputHiddenUbicacion->setIdName($key);
                $inputHiddenUbicacion->setId($value);
                $inputHiddenUbicacion->setIdExtendido($idExtendido);
                $inputHiddenUbicacion->setIdExtendidoSp("sp.af_$idExtendido");
                $this->inputHiddenFiltro->addInputHiddenUbicacion($inputHiddenUbicacion);
            }
        }
        $this->logMessage("input hidden ubicacion last selected id $id tabla $tabla id extendido $idExtendido", "info");
        if($id>0 && $tabla!=""){
            $names = "";
            $cantidad = 0;
            $contador = 0;
            $inputHiddenUbicacionLast = new InputHiddenUbicacionLast();
            $lista= Doctrine_Core::getTable($tabla)->getElements($id);
            $inputHiddenUbicacionLast->setIdBD($id);
            $inputHiddenUbicacionLast->setId("selectedLowestRegion");
            
            $inputHiddenUbicacionLast->setValue($idExtendido);
            
            $cantidad = count($lista);
            foreach ($lista as $value){
                $contador++;
                $names.= $value->getName();
                if($contador<$cantidad){
                    $names.= "/" ;
                }
            }
            $inputHiddenUbicacionLast->setName($names);
            $this->logMessage("input hidden ubicacion last selected id $id tabla $tabla id extendido $idExtendido names $names", "info");
            $this->inputHiddenFiltro->setInputHiddenUbicacionLast($inputHiddenUbicacionLast);
        }
    }
    private function generarEliminarFiltro(&$eliminarListafiltros,$strParams,$list){
        $cantidad = count($list);
        if($cantidad>0){
            $eliminarFiltro = new EliminarFiltroItem();
            $urlHref = "/frontend_dev.php/search/index";
            if($strParams!=""){
                $urlHref .="?".$strParams;
            }
            $eliminarFiltro->setUrlParametro($urlHref);
            foreach ($list as $nivel){
                $eliminarFiltro->setId($nivel->getId());
                $eliminarFiltro->setName($nivel->getName());
            }
            array_push($eliminarListafiltros, $eliminarFiltro);
        }
    }
    private function getPosibleResultado($params,$urlParamKey,$urlId){
        return Doctrine_Core::getTable("Institucion")->getPosibleResultado($params,$urlParamKey,$urlId);
    }
    private function generarFiltrosObject($prefixId,$class,$name,$label,$list,$countEnabled,$urlParams,$params,$urlParamKey,$separadorStyle,$listadoCountStyle="",$funcionJavaScript="void(0)"){
        $value = "";
        $items = "";
        $count=0;
        $totalCount = 0;
        $tieneItemFiltro = false;
        $resultadoBusqueda = 0;
        $totalCount = count($list);
        $cantidadItemFiltro = 0;
        $filtro = new Filtro();
        $itemsFiltro = array();
        foreach ($list as $item){
            $resultadoBusqueda = $this->getPosibleResultado($params,$urlParamKey,$item->getId());            
            if($resultadoBusqueda>0){
                $tieneItemFiltro = true;
                $itemFiltro = new ItemFiltro();
                $itemFiltro->setPrefixId($prefixId);
                $itemFiltro->setId($item->getId());
                $itemFiltro->setName($item->getName());
                $itemFiltro->setTotalCount($resultadoBusqueda);

                $itemFiltro->setHref('/frontend_dev.php/search/index?'.$urlParams.'='.$item->getId());
                $itemFiltro->setNameLink($prefixId+$item->getId());
                $count++;
                if($count<=$countEnabled){
                    $itemFiltro->setDisplayLi("");
                }else{
                    $itemFiltro->setDisplayLi("display: none;");
                }            
                array_push($itemsFiltro, $itemFiltro);
            }
        }
        //para mostrar el filtro debe tener mas de item filtro 
        $cantidadItemFiltro = count($itemsFiltro);
        if($tieneItemFiltro && $cantidadItemFiltro>1){
            $filtro->setClass($class);
            $filtro->setLabel($label);
            $filtro->setName($name);
            $filtro->setItems($itemsFiltro);
            $filtro->setSeparadorStyle($separadorStyle);
            $filtro->setListadoCountStyle($listadoCountStyle);
            $filtro->setFuncionJavaScript($funcionJavaScript);
            array_push($this->filtros, $filtro);
        }
        $this->logMessage("filtro $this->filtros",'info');
    }
    public function getFiltros() {
        return $this->filtros;
    }
    public function getEliminarfiltros() {
        return $this->eliminarfiltro;
    }
    public function getFiltroUbicacion() {
        return $this->filtroUbicacion;
    }

    public function getInputHiddenFiltro() {
        return $this->inputHiddenFiltro;
    }

    public function setInputHiddenFiltro($inputHiddenFiltro) {
        $this->inputHiddenFiltro = $inputHiddenFiltro;
    }


}

?>
